/* ************************************************************************

   Copyright:
     2008 openWorks

   License:
     LGPL: http://www.gnu.org/licenses/lgpl.html
     See the LICENSE file in the project's top-level directory for details.

   Authors:
     * Martín Alejandro Paz

************************************************************************ */

/**
* Registro logico del {@link qx.ui.form.ow.SQL}.
* 
* *Ejemplo:*
*
* <pre class='javascript'>
* TODO.
*  </pre>
*/
qx.Class.define("qx.ui.form.ow.Row",
{
	extend : qx.core.Object,
	events :
	{
		"queryCompleted" : "qx.event.type.Data"
	},
	/**
	* Crea una nueva instancia del objeto *qx.ui.form.ow.Row*
	* @param sql {qx.ui.form.ow.SQL} Objeto SQL.
	*/
	construct : function (sql)
	{
		this.base(arguments);
		this._SQL = sql;
		this._Values = [];
	},
	
/*
*****************************************************************************
     MEMBERS
*****************************************************************************
*/
	members :
	{
		_SQL : null,
		_Fields : null,
		_Values : null,
		_insert_id : null,
		getInsertId : function () { return this._insert_id },
		/**
		* Ejecuta la consulta SQL.
		* @param sql {String} Consulta SQL.
		*/
		_query : function (sql)
		{
			var ajax = new qx.io.remote.Request("xml.php", "GET", "text/plain");
			if (!ajax.hasListener("completed"))
			{
				ajax.addListener("completed", function (e)
				{
					this._insert_id = e.getContent();
					this.fireDataEvent("queryCompleted");
				}, this);
			}
			ajax.setParameter("routine", "runQuery");
			ajax.setParameter("query", sql);
			ajax.setAsynchronous(false);
			ajax.send();
		},
		
		/**
		* Trae los datos en funcion del parametro where.
		* @param where {String} Condicion  SQL.
		* @return {void}
		*/
		findFirst : function (where)
		{
			if (where != null)
			{
				this.newOne();
				var SQL = this._SQL;
				if (!SQL.hasListener("oneDataCompleted"))
				{
					SQL.addListener("oneDataCompleted", function (e)
					{
						var rs = e.getData().getElementsByTagName("reg");
						if (rs.length != 0)
						{
							for (r in this._Fields)
							{
								//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
								if (String(parseInt(r)) != 'NaN')
								{
										this._Values[this._Fields[r].name] = rs[0].getAttribute(this._Fields[r].name);
								}
							}
						}
					}, this);
				}
				SQL.getOneData(where);
			}
			else
			{
				qx.log.Logger.error(this, "FINDFIRST: Debe enviar una condicion WHERE");
			}
		},
		/**
		* Genera un nuevo registro en funcion del {@link qx.ui.form.ow.SQL}.
		* @return {void}
		*/
		newOne : function (pepe)
		{
			this._Values = '';
			this._Values = [];
			this._Fields = this._SQL.getStructure();
			var r = '';
			for (r in this._Fields)
			{
				//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
				if (String(parseInt(r)) != 'NaN')
				{
					this._Values[this._Fields[r].name] = '';
				}
			}
		},
		/**
		* Asigna un valor al campo especificado.
		* @param field {String} Nombre del campo del {@link qx.ui.form.ow.SQL}
		* @param value {String} Valor del campo del {@link qx.ui.form.ow.SQL}
		* @return {void}
		*/
		setValue : function (field, value)
		{
			var ban = true;
			var r = '';
			for (r in this._Fields)
			{
				//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
				if (String(parseInt(r)) != 'NaN')
				{
					if ((this._Fields[r].name == field) && (ban == true))
					{
						ban = false;
					}
				}
			}
			if (ban)
			{
				qx.log.Logger.error(this, "Campo '" + field + "' no existe en la tabla");
			}
			else
			{
				this._Values[field] = value;
			}
		},
		/**
		* Devuelve el valor de un campo determinado.
		* @param field {String} Nombre del campo del {@link qx.ui.form.ow.SQL}
		* @return {String}
		*/
		getValue : function (field)
		{
			return this._Values[field];
		},
		/**
		* Realiza la insercion de un nuevo registro en la tabla.
		* @return {void}
		*/
		insert : function ()
		{
			var sql = '';
			var fields = '';
			var values = '';
			sql += "INSERT INTO ";
			sql += this._SQL.getTable() + " ";
			var r = '';
			for(r in this._Values)
			{
				//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
				if (typeof this._Values[r] != 'function')
				{
					if ((this._Values[r] != null) && (this._Values[r] != ''))
					{
						if (fields == '')
						{
							fields += r;
						}
						else
						{
							fields += ", " + r;
						}
					}
				}
			}
			var r = '';
			for(r in this._Values)
			{
				//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
				if (typeof this._Values[r] != 'function')
				{
					if ((this._Values[r] != null) && (this._Values[r] != ''))
					{
						if (values == '')
						{
							values += "'" + this._Values[r] + "'";
						}
						else
						{
							values += ", '" + this._Values[r] + "'";
						}
					}
				}
			}
			sql += "( " + fields + " )";
			sql += " VALUES ";
			sql += "( " + values + " )";
			this._query(sql);
		},
		/**
		* Realiza la actualizacion de aquellos campos de un registro que han sido modificados.
		* @param where {String} Condicion SQL.<br />
		* _Aclaracion:_ Actualiza el primer registro que cumpla la condicion.
		* @return {void}
		*/
		update : function (where)
		{
			if (where != null)
			{
				var sql = '';
				var fields = '';
	
				sql += "UPDATE ";
				sql += this._SQL.getTable() + " ";
				sql += "SET ";
				for (r in this._Values)
				{
					//*************** EL 'IF' ES PARCHE PARA INTERNET EXPLORER **********************
					if (typeof this._Values[r] != 'function')
					{
						if (this._Values[r] != null)
						{
							if (fields == '')
							{
								fields += r + " = '" + this._Values[r] + "'";
							}
							else
							{
								fields += ", " + r + " = '" + this._Values[r] + "'";
							}
						}
					}
				}
				sql += fields + " ";
				sql += "WHERE ";
				sql += where + " ";
				sql += "LIMIT 1";
				this._query(sql);
			}
			else
			{
				qx.log.Logger.error(this, "UPDATE: Debe enviar una condicion WHERE");
			}
		},
		/**
		* Realiza la eliminacion de un registro de la tabla.
		* @param where {String} Condicion SQL.<br />
		* _Aclaracion:_  Elimina el primer registro que cumpla la condicion.
		* @return {void}
		*/		
		remove : function (where)
		{
			if (where != null)
			{
				var sql = '';
				sql += "DELETE FROM ";
				sql += this._SQL.getTable() + " ";
				sql += "WHERE ";
				sql += where + " ";
				sql += "LIMIT 1";
				this._query(sql);
			}
			else
			{
				qx.log.Logger.error(this, "REMOVE: Debe enviar una condicion WHERE");
			}
		},
		
		/**
		* Devuelve el valor de SQL (debe usarse solo con campos DATE) formateado de la forma dd/mm/aaaa.
		* @return {String}
		*/
		getValueDate : function (field) {
		var dateQx = this.getValue(field).substr(8,4) + '/' + this.getValue(field).substr(5,2) + '/' + this.getValue(field).substr(0,4);
		return dateQx;
		}
	}
});
